From: Sebastian Keller Date: Tue, 2 Feb 2021 21:31:32 +0000 (+0100) Subject: workspace: Handle window-added and removed signal after window tracker X-Git-Tag: archive/raspbian/50.5-1+rpi1~1^2~616^2^2~494 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=454394a267ba94492c14c2e1de720e5fc78483bd;p=gnome-shell.git workspace: Handle window-added and removed signal after window tracker The new window preview overlay requires getting the app icon for a window from the window tracker when it gets initialized. The window tracker listens for the same 'window-added' signal on the MetaWorkspace that the gnome-shell Workspace listens for to add the window preview. The window tracker however reconnects all its signal handlers whenever the number of workspaces changes, which means that its signal handlers get called after the ones in Workspace ones. So by the time the 'window-added' handler in Workspace is called, the window tracker does not have an app associated with the window. To fix this ensure that all window related signal handlers in Workspace are run after the ones in the window tracker. Fixes https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/3656 Part-of: --- diff --git a/js/ui/workspace.js b/js/ui/workspace.js index ff4d4c70b..951f45219 100644 --- a/js/ui/workspace.js +++ b/js/ui/workspace.js @@ -982,17 +982,17 @@ class Workspace extends St.Widget { this._addWindowClone(windows[i]); } - // Track window changes + // Track window changes, but let the window tracker process them first if (this.metaWorkspace) { - this._windowAddedId = this.metaWorkspace.connect('window-added', - this._windowAdded.bind(this)); - this._windowRemovedId = this.metaWorkspace.connect('window-removed', - this._windowRemoved.bind(this)); + this._windowAddedId = this.metaWorkspace.connect_after( + 'window-added', this._windowAdded.bind(this)); + this._windowRemovedId = this.metaWorkspace.connect_after( + 'window-removed', this._windowRemoved.bind(this)); } - this._windowEnteredMonitorId = global.display.connect('window-entered-monitor', - this._windowEnteredMonitor.bind(this)); - this._windowLeftMonitorId = global.display.connect('window-left-monitor', - this._windowLeftMonitor.bind(this)); + this._windowEnteredMonitorId = global.display.connect_after( + 'window-entered-monitor', this._windowEnteredMonitor.bind(this)); + this._windowLeftMonitorId = global.display.connect_after( + 'window-left-monitor', this._windowLeftMonitor.bind(this)); this._layoutFrozenId = 0; // DND requires this to be set